package com.ky.untils;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.*;

//方法二 dfa算法
public class SensitiveUtil {




    public static Map<Character, Map> getSentiveWorld() throws IOException {

        List<String> list = new LinkedList<> ();
        Reader fileReader = new FileReader ("src\\main\\resources\\word.txt");
        BufferedReader bufferedReader = new BufferedReader (fileReader);
        String  line;
        while ((line  = bufferedReader.readLine ())!=null){
            list.add (line);

        }
        bufferedReader.close ();



        //root:根节点 char的包装类
        Map<Character, Map> root = new HashMap<> ();
        //node:当前节点
        Map<Character, Map> node = new HashMap<>();
        //遍历敏感词列表，取出每一个敏感词
        for (String word : list) {
            //遍历每个敏感词前先把node指向root
            node = root;
            //遍历每一个敏感词的每一个字符
            for (int i = 0; i < word.length(); i++) {
                if (node.containsKey(word.charAt(i))) {
                    //如果node包含该字符，node指向该字符（key）所对应的value
                    node = node.get(word.charAt(i));
                } else {
                    //如果node不包含该字符，向node中添加以该字符为（key），next为（value）的map，并把node指向next
                    //next:下一个节点
                    Map<Character, Map> next = new HashMap<>();
                    node.put(word.charAt(i), next);
                    node = next;
                }
            }
            //遍历完每一个敏感词之后都在末尾添加一个结束标志
            node.put('\t', null);
        }
        return root;
    }
    //封装特殊字符
    public static HashSet<Character> chars = new HashSet<Character>() {{
        add(' ');
        add('·');
        add('ˉ');
        add('ˇ');
        add('¨');
        add('々');
        add('·');
        add('～');
        add('‖');
        add('∶');
        add('"');
        add('|');
        add('〃');
        add('〔');
        add('〕');
        add('〈');
        add('〉');
        add('「');
        add('」');
        add('『');
        add('』');
        add('．');
        add('[');
        add(']');
        add('{');
        add('}');
        add('\'');
        add('【');
        add('】');
    }};
    //替换特殊字符
    public static String replaceContent(String str, Map<Character, Map> map) {
        //下标指针
        int index;
        //是否有敏感词汇统计
        int count;
        StringBuilder sb = new StringBuilder();
        //遍历字符串
        for (int i = 0; i < str.length(); i +=index) {
            index = 0;
            count = 0;
            //将封装好敏感词汇的map赋值给map1
            Map<Character, Map> map1 = map;
            //判断map1中是否包含敏感词



            while (map1.containsKey(str.charAt(i + index))) {
                //包含敏感词就将str.charAt(i + index)（敏感词）（key）所对应的value赋值给map1
                map1 = map1.get(str.charAt(i + index));
                //下标指针加一
                index++;
                //判断map1中是否包含结束符
                if (map1.containsKey('\t')) {
                    //包含结束符代表含有敏感词汇
                    count++;
                    break;
                }
              //判断下标指针加一之后是否为特殊字符
               while (chars.contains(str.charAt(i + index))) {
                    //是特殊字符则下标指针加一
                    index++;
                }

            }


            if (count != 0) {
                //包含敏感词汇追加*
                sb.append('*');
                //i变成(i+下标指针)
            } else {
                //不包含敏感词汇追加该字符
                sb.append(str.charAt(i));
                //下标指针回到1
                index = 1;
                //i变成(i+下标指针)
            }
        }
        return sb.toString();
    }


}
